package com.wasion.gydpe.dao;

import java.io.Serializable;
import java.util.List;
import java.util.Map;

import com.wasion.gydpe.exception.DataAccessException;

/**
 * BaseDao DAO层泛型接口，定义基本的DAO功能
 * 
 * @author 高意
 * @param <T>
 *            实体类
 * @param <PK>
 *            主键类，必须实现Serializable接口
 * @date
 * 
 */
public abstract interface GenericDao<T, PK extends Serializable> {

	/**
	 * 插入一个实体（在数据库INSERT一条记录）
	 * 
	 * @param entity
	 *            实体对象
	 */
	public abstract int add(T entity) throws DataAccessException;

	/**
	 * 删除符合条件的记录
	 * <p>
	 * <strong>此方法一定要慎用，如果条件设置不当，可能会删除有用的记录！</strong>
	 * </p>
	 * 
	 * @param param
	 *            用于产生SQL的参数值，包括WHERE条件（其他参数内容不起作用）
	 * @return
	 */
	public abstract boolean remove(Map<String, Object> param)
			throws DataAccessException;

	/**
	 * 清空表，比delete具有更高的效率，而且是从数据库中物理删除（delete是逻辑删除，被删除的记录依然占有空间）
	 * <p>
	 * <strong>此方法一定要慎用！</strong>
	 * </p>
	 * 
	 * @return
	 */
	public abstract boolean truncate() throws DataAccessException;

	/**
	 * 修改一个实体对象（UPDATE一条记录）
	 * 
	 * @param entity
	 *            实体对象
	 * @return 修改的对象是否成功
	 */
	public abstract boolean modify(T entity) throws DataAccessException;

	/**
	 * 修改符合条件的记录
	 * 
	 * @param param
	 *            用于产生SQL的参数值，包括WHERE条件、目标字段和新值等
	 * @return 判断修改是否成功
	 */
	public abstract boolean modify(Map<String, Object> param)
			throws DataAccessException;

	/**
	 * 取全部记录
	 * 
	 * @return 全部记录实体对象的List
	 */
	public abstract List<T> query() throws DataAccessException;

	/**
	 * 查询整表总记录数
	 * 
	 * @return 整表总记录数
	 */
	public abstract long count() throws DataAccessException;

	/**
	 * 按条件查询记录
	 * 
	 * @param param
	 *            查询条件参数，包括WHERE条件、分页条件、排序条件
	 * @return 符合条件记录的实体对象的List
	 */
	public abstract List<T> query(Map<String, Object> param)
			throws DataAccessException;

	/**
	 * 查询符合条件的记录数
	 * 
	 * @param param
	 *            查询条件参数，包括WHERE条件（其他参数内容不起作用）。此参数设置为null，则相当于count()
	 * @return
	 */
	public abstract long count(Map<String, Object> param)
			throws DataAccessException;

	/**
	 * 分页查询，按条件查询记录
	 * 
	 * @param param
	 *            查询条件参数，包括WHERE条件、分页条件、排序条件
	 * @return 符合条件的分页记录的实体对象的List
	 */
	public abstract List<T> queryByPaging(Map<String, Object> param)
			throws DataAccessException;

	/**
	 * 按条件查询唯一记录
	 * 
	 * @param param
	 *            查询条件参数，包括WHERE条件
	 * @return 符合条件的实体对象
	 */
	public abstract T getOne(Map<String, Object> param)
			throws DataAccessException;

}